package pub.tbc.api.handler;

import io.netty.channel.*;
import io.netty.handler.codec.http.FullHttpRequest;
import lombok.extern.slf4j.Slf4j;
import pub.tbc.api.invoker.Invoker;
import pub.tbc.api.invoker.InvokerFactory;


/**
 * netty处理链最后一环，请求转发；
 * 需要：具体协议的请求转发组件，获取该组件需要协议转换组件
 *
 * @author tbc on 2017/3/3 13:10:53.
 */
@Slf4j
public class InvokerHandler extends SimpleChannelInboundHandler<FullHttpRequest> {
    // 具体的的调用器应该按配置生成（约定默认值），交由专门的工厂处理
    private Invoker invoker = InvokerFactory.getInvoker();

    @Override
    public void channelRead0(final ChannelHandlerContext ctx, final FullHttpRequest msg) throws Exception {
        log.debug("[in]event read - 调用Invoker组件");
        final Channel inboundChannel = ctx.channel();
        invoker.invoke(ctx, msg);
        log.debug("[in]主线程处理结束...");
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.flush();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext context, Throwable cause) {
        log.error("[in]发生异常： {}", cause.getMessage());
        context.close();
        context.fireChannelRead(cause);
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        log.debug("[in][断开连接]channelInactive...");
    }

    @Override
    public void channelActive(ChannelHandlerContext context) throws Exception {
        log.debug("[in][建立连接]channelActive...");
        super.channelActive(context);
    }

}
